/**
 * 错误信息处理工具
 */

// 错误码映射
const ERROR_MESSAGES: Record<string, string> = {
  // 通用错误
  AUTH_FAIL: '认证失败，请重新登录',
  TOKEN_EXPIRED: '登录已过期，请重新登录',
  PERMISSION_DENIED: '权限不足，无法执行此操作',
  PARAM_ERROR: '参数错误，请检查输入信息',
  SYSTEM_ERROR: '系统错误，请稍后重试',
  NETWORK_ERROR: '网络错误，请检查网络连接',
  SERVICE_UNAVAILABLE: '服务暂时不可用，请稍后重试',

  // 登录相关错误
  USERNAME_OR_PASSWORD_ERROR: '用户名或密码错误',
  ACCOUNT_DISABLED: '账号已被禁用，请联系管理员',
  ACCOUNT_LOCKED: '账号已被锁定，请联系管理员',
  LOGIN_TOO_FREQUENT: '登录过于频繁，请稍后重试',
  CAPTCHA_ERROR: '验证码错误',
  CAPTCHA_EXPIRED: '验证码已过期，请重新获取',

  // 用户相关错误
  USER_NOT_FOUND: '用户不存在',
  USER_ALREADY_EXISTS: '用户已存在',
  MOBILE_ALREADY_EXISTS: '手机号已被使用',
  EMAIL_ALREADY_EXISTS: '邮箱已被使用',

  // 文件相关错误
  FILE_TOO_LARGE: '文件过大，请选择较小的文件',
  FILE_TYPE_NOT_SUPPORTED: '文件类型不支持',
  FILE_UPLOAD_FAILED: '文件上传失败，请重试',

  // 业务相关错误
  DATA_NOT_FOUND: '数据不存在',
  DATA_ALREADY_EXISTS: '数据已存在',
  OPERATION_FAILED: '操作失败，请重试',
  STATUS_ERROR: '状态错误，无法执行此操作',
}

/**
 * 根据错误码获取友好的错误信息
 * @param code 错误码
 * @param defaultMsg 默认错误信息
 * @returns 友好的错误信息
 */
export function getErrorMessage(code: string | number, defaultMsg: string = '操作失败'): string {
  const codeStr = String(code)

  // 优先使用错误码映射
  if (ERROR_MESSAGES[codeStr]) {
    return ERROR_MESSAGES[codeStr]
  }

  // 如果没有映射，返回默认信息
  return defaultMsg || '操作失败，请重试'
}

/**
 * 处理API错误响应
 * @param error 错误对象
 * @returns 友好的错误信息
 */
export function handleApiError(error: any): string {
  console.error('API错误:', error)

  // 如果是网络错误
  if (error.errMsg && error.errMsg.includes('request:fail')) {
    return '网络连接失败，请检查网络设置'
  }

  // 如果是HTTP状态码错误
  if (error.statusCode) {
    switch (error.statusCode) {
      case 400:
        return '请求参数错误'
      case 401:
        return '未授权，请重新登录'
      case 403:
        return '权限不足'
      case 404:
        return '请求的资源不存在'
      case 500:
        return '服务器内部错误'
      case 502:
        return '网关错误'
      case 503:
        return '服务不可用'
      case 504:
        return '网关超时'
      default:
        return `请求失败 (${error.statusCode})`
    }
  }

  // 如果是业务错误
  if (error.data && error.data.code) {
    return getErrorMessage(error.data.code, error.data.msg)
  }

  // 如果是字符串错误
  if (typeof error === 'string') {
    return error
  }

  // 如果是Error对象
  if (error.message) {
    return error.message
  }

  // 默认错误信息
  return '操作失败，请重试'
}

/**
 * 显示错误提示
 * @param error 错误对象
 * @param _title 提示标题
 */
export function showErrorToast(error: any, _title: string = '错误') {
  const message = handleApiError(error)
  uni.showToast({
    title: message,
    icon: 'error',
    duration: 3000,
  })
}

/**
 * 显示成功提示
 * @param message 成功信息
 * @param _title 提示标题
 */
export function showSuccessToast(message: string, _title: string = '成功') {
  uni.showToast({
    title: message,
    icon: 'success',
    duration: 2000,
  })
}
